// 配置axios请求实例

import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'

const instance = axios.create({
  // baseURL: 'http://47.98.187.80:5000',
  // eslint-disable-next-line no-undef
  baseURL: process.env.VUE_APP_SERVER_URL,
  timeout: 30000,
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    if (store.state.token) {
      config.headers['token'] = store.state.token
    }

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data
  },
  async function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 获取http状态码
    let status = error.response.status
    switch (status) {
      case 401:
        try {
          // 1. 刷新token (不能经过请求和响应拦截器)
          let { data } = await axios({
            method: 'post',
            // eslint-disable-next-line no-undef
            url: process.env.VUE_APP_SERVER_URL + '/api/refreshToken',
            data: { refreshToken: store.state.refreshToken },
          })

          // 2. 刷新成功后更新vuex中的token,失败则打回登录页面
          let { userInfo, token } = data
          store.commit('setUserInfo', userInfo)
          store.commit('setToken', { token, refreshToken: store.state.refreshToken })

          // 3. 重发请求(基于原来的配置)
          return instance(error.config)
        } catch (err) {
          // 刷新token失败
          store.commit('clearToken')
          store.commit('clearUserInfo')
          router.replace('/login?redirect=' + router.currentRoute.fullPath)
        }
        break
      case 500:
        Toast('服务器异常')
        break
    }
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export default instance
